//
// Created by Zhangwj on 2023/9/27.
//

#include "LValExpStmtItemNode.h"

std::unique_ptr<LValExpStmtItemNode> LValExpStmtItemNode::LValExpStmtItemParser(Parser &parser) {
    // LVal '=' Exp ';'               -> Ident { '[' Exp ']' } '=' Exp ';'
    // | LVal '=' 'getint''('')'';'   -> Ident { '[' Exp ']' } '=' 'getint' '('...
    // | [Exp] ';'                    -> Ident { '[' Exp ']' } '+-*/%' || ';' || '(' Exp ')'... || Number || '+'|'-'|'!'
    std::unique_ptr<LValExpStmtItemNode> lValExpStmtItemNode = std::make_unique<LValExpStmtItemNode>();
    if (parser.getLexType(0) == LexType::IDENFR) {
        //三种可能
        bool isExp = true;
        // 在下一个分号之前找'='，如果有，则为前两种情况
        for (int i = 1; parser.getLexType(i) != LexType::SEMICN && parser.getLexType(i) != LexType::LEXER_END; i++) {
            if (parser.getLexType(i) == LexType::ASSIGN) {
                isExp = false;
                break;
            }
        }
        if (isExp) {
            // 是 [Exp] ';' 且 Exp 存在
            lValExpStmtItemNode->type = LValExpStmtItemNodeType::EXP;
            lValExpStmtItemNode->Exp = ExpNode::ExpParser(parser);
            if (parser.getLexType(0) == LexType::SEMICN) {
                parser.next();
            }
        } else {
            // LVal '=' Exp ';' 或者 LVal '=' 'getint''('')'';'
            lValExpStmtItemNode->LVal = LValNode::LValParser(parser);
            if (parser.getLexType(0) == LexType::ASSIGN) {
                parser.next();
            }
            if (parser.getLexType(0) == LexType::GETINTTK) {
                // 是 LVal '=' 'getint''('')'';'
                lValExpStmtItemNode->type = LValExpStmtItemNodeType::GETINT;
                parser.next();
                if (parser.getLexType(0) == LexType::LPARENT) {
                    parser.next();
                }
                if (parser.getLexType(0) == LexType::RPARENT) {
                    parser.next();
                }
                if (parser.getLexType(0) == LexType::SEMICN) {
                    parser.next();
                }
            } else {
                // 是 LVal '=' Exp ';'
                lValExpStmtItemNode->type = LValExpStmtItemNodeType::LVALEXP;
                lValExpStmtItemNode->Exp = ExpNode::ExpParser(parser);
                if (parser.getLexType(0) == LexType::SEMICN) {
                    parser.next();
                }
            }
        }
    } else {
        //只可能是 [Exp] ';'
        lValExpStmtItemNode->type = LValExpStmtItemNodeType::EXP;
        if (parser.getLexType(0) != LexType::SEMICN) {
            //[Exp]存在
            lValExpStmtItemNode->Exp = ExpNode::ExpParser(parser);
        }
        if (parser.getLexType(0) == LexType::SEMICN) {
            parser.next();
        }
    }
    return lValExpStmtItemNode;
}
